package cl.minvu.catastro.manager;

import java.math.BigInteger;
import java.util.List;

import javax.persistence.EntityManager;

import org.apache.log4j.Logger;

import cl.minvu.catastro.model.DanoVivienda;
import cl.minvu.catastro.model.EstadoFicha;
import cl.minvu.catastro.model.Ficha;
import cl.minvu.catastro.model.GrupoSecundario;
import cl.minvu.catastro.model.InstalacionDomiciliaria;

/**
 * @author psep
 * 
 */
public class FichaManager extends AbstractManager {

	private static final Logger logger = Logger
			.getLogger(EncuestadorManager.class);
	private static final FichaManager instance = new FichaManager();

	/**
	 * Constructor privado por defecto para el patrón Singleton.
	 */
	private FichaManager() {
	}

	/**
	 * Método estático que retorna la instancia única de la clase FichaManager
	 * con el patrón singleton.
	 * 
	 * @return FichaManager
	 */
	public static final FichaManager getInstance() {
		return instance;
	}

	/**
	 * @param ficha
	 * @param instalaciones
	 * @param danoViviendas
	 * @param grupoSecundarios
	 * @return
	 */
	public Boolean createFicha(Ficha ficha,
			List<InstalacionDomiciliaria> instalaciones,
			List<DanoVivienda> danoViviendas,
			List<GrupoSecundario> grupoSecundarios) {
		boolean resultado = false;
		EntityManager em = null;
		
		try {
			em = super.getEntityManager();
			em.getTransaction().begin();
			
			BigInteger iddireccion = DireccionManager.getInstance().createDireccion(ficha.getDireccion(), em);
			BigInteger idencuestado= null;
			
			if (ficha.getEncuestado() != null) {
				idencuestado = EncuestadoManager.getInstance().createEncuestado(ficha.getEncuestado(), em);
				ficha.getEncuestado().setIdencuestado(idencuestado);
				GrupoSecundarioManager.getInstance().setList(grupoSecundarios, ficha.getEncuestado(), em);
			}
			
			if (iddireccion == null) {
				em.getTransaction().rollback();
			} else {
				ficha.getDireccion().setIddireccion(iddireccion);
				
				BigInteger idficha = this.createFicha(ficha, em);
				
				if (idficha == null) {
					em.getTransaction().rollback();
				} else {
					ficha.setIdficha(idficha);
					
					boolean flagInstalacion = InstalacionDomiciliariaManager.getInstance().setList(instalaciones, ficha, em);
					boolean flagDanios = DanioViviendaManager.getInstance().setList(danoViviendas, ficha, em);
					
					if (!flagDanios || !flagInstalacion) {
						em.getTransaction().rollback();
					} else {
						em.getTransaction().commit();
						resultado = true;
					}
					
				}
			}
			
			
		} catch (Exception e) {
			logger.error(e, e);
		} finally {
			super.close(em);
		}

		return resultado;
	}
	
	/**
	 * @param ficha
	 * @param em
	 * @return
	 */
	public BigInteger createFicha(Ficha ficha, EntityManager em) {
		try {
			EstadoFicha estado = new EstadoFicha();
			estado.setIdestadoficha(1);
			ficha.setEstadoFicha(estado);
			em.persist(ficha);
		} catch (Exception e) {
			logger.error(e, e);
		}
		
		return ficha.getIdficha();
	}

}
